一個偽理科人最喜歡說的詞語,只要說出這一詞,頓時能成為全場話題終結者沒有之一,一個跟費波那契回調聽起來一樣但其實不一樣的事物,一個是跟兔子生育數有關(很會生),一個是跟網路股票知名聽牌名人分析時的話術,甚麼黃金比例預測股票上揚,我每天多吃一份雞腿便當體重會逐年上升還比較準。好了,為甚麼我今天會提這個呢?
因為,我今天上coursera的課程開始感到時間停滯(這往往不是好現象),主講者秀出了不同版本的費波那契數公式,但卻感覺在拖時間,因為他一直強調演算法的重要性,然而卻不解釋任一其中費波納契數在幹嘛,為了讓我能找回學習的動力,我決定自己打一份費波納契數的程式。
費波納契數公式:
F0=0
F1=1
Fn=Fn-1+Fn-2(n≧2)
將公式帶入執行,結果呈列出來我們會看見:
0、1、 1、 2、 3、 5、 8、 13、 21、 34、 55、 89、 144、 233、 377、 610、 987......
正如Fn=Fn-1+Fn-2(n≧2)一樣,下一筆數值是前兩項數值的加總,而這是大自然中常見的黃金比例,例如貝殼。
至於如何呈現出能快速計算出費波納契數的程式,靠的是觀察和一點小巧思(你也可以說小聰明,我不介意),這題就如同Day 10的問題,也許能宣告vector進行計算,然而隨著迴圈地進行還一直呼叫之前的index(ex: f[n-1]),會導致計算時間過長,如果有stress test就會得到time limit的結果,所以呢,我們要突破盲腸,放棄vector(誤),以下是我的程式,仔細觀察,就會知道我做了甚麼:
//費波納契數
#include<iostream>
using namespace std;
int main(){
while(true){
long long a=0,b=1,c=0;
int n;
cin>>n;
if(n==0){
cout<<"F"<<n<<" is "<<a<<endl;
}
else if(n==1){
cout<<"F"<<n<<" is "<<b<<endl;
}
else{
for(int i=0;i<n-1;i++){
c=a+b;//悄悄替換了一些東西
a=b;//將b值給a
b=c;//將c 值給b,想想我在幹嘛
}
cout<<"F"<<n<<" is "<<c<<endl;
}
}
return 0;
}
雖然維基百科似乎有更簡潔優美的範例程式,但我認為自己的產出也挺不錯的(沒錯,就是沒根據得自賣自誇)。
最後,當主講者強調費波納契數n值越大,越能感受到前值相加後龐大數能力時,我默默輸入數值與他背後的範例比對
恩,完全正確了呢! I did it!